package dp;

/**
 * 有两种形状的瓷砖：一种是 2 x 1 的多米诺形，另一种是形如 "L" 的托米诺形。两种形状都可以旋转。
 * 给定整数 n ，返回可以平铺 2 x n 的面板的方法的数量。返回对 109 + 7 取模 的值。
 * 平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同，当且仅当面板上有四个方向上的相邻单元中的两个，使得恰好有一个平铺有一个瓷砖占据两个正方形。
 * <p>
 * 示例 1:
 * 输入: n = 3
 * 输出: 5
 * 解释: 五种不同的方法如上所示。
 * <p>
 * 示例 2:
 * 输入: n = 1
 * 输出: 1
 *
 * @author Jisheng Huang
 * @version 20250505
 */
public class DominoAndTrominoTiling_790 {
    /**
     * Create a dp array and use the formula dp[i] = (2 * dp[i - 1]) % mod + dp[i - 3]
     *
     * @param n the given integer
     * @return number of combination
     */
    public static int numTilings(int n) {
        int[] dp = new int[n + 4];
        int mod = 1000000007;

        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 5;

        for (int i = 4; i <= n; ++i) {
            dp[i] = (2 * dp[i - 1]) % mod + dp[i - 3];
            dp[i] %= mod;
        }

        return dp[n];
    }

    public static void main(String[] args) {
        System.out.println(numTilings(3));
        System.out.println(numTilings(1));
        System.out.println(numTilings(10));
    }
}
